package main

import (
	"Ljohn/pipelineTest/first"
	"fmt"
	"sync"
)

func main() {
	t2()
}

func t1() {
	c := first.Gen(2, 3)
	out := first.Sq(c)
	fmt.Println(<-out)
	fmt.Println(<-out)
}

func t2() {
	c := first.Gen(2, 3)
	out1 := first.Sq(c)
	out2 := first.Sq(c)

	for n := range merge(out1, out2) {
		fmt.Println(n)
	}
}

func merge(cs ...<-chan int) <-chan int {
	var wg sync.WaitGroup
	out := make(chan int) // 为 cs 中的每个输入通道启动一个输出 goroutine。output // 将值从 c 复制到 out 直到 c 关闭，然后调用 wg.Done。
	output := func(c <-chan int) {
		for n := range c {
			out <- n
		}
		wg.Done()
	}
	wg.Add(len(cs))
	for _, c := range cs {
		go output(c)
	} // 一旦所有输出 goroutines完成，启动一个 goroutine 关闭。这必须在 wg.Add 调用之后开始。
	go func() {
		wg.Wait()
		close(out)
	}()
	return out
}
